<?php

/**
 * Controller de Movimientos.
 *
 *
 * @filesource          
 * @copyright		
 * @link		http://www.pragmatia.com Pragmatia
 * @package		datagro
 * @subpackage	app.controllers
 * @version     1.1
 * @license		http://www.opensource.org/licenses/mit-license.php The MIT License
 * @author      Martin Radosta <mradosta@pragmatia.com>
 */

/**
 * Clase MovimientosController
 *
 * @package	    datagro
 * @subpackage	app.controllers
 */
class MovimientosController extends AppController {

    var $name = 'Movimientos';
    var $uses = array('Documento', 'Alerta', 'Cliente', 'Sim', 'Usuario', 'Abono');
    var $components = array('Mailer');
    var $iva = "21";

    /**
     * abonosDisponibles.
     *
     */
    function abonosDisponibles() {
        $this->set('registros', $this->Abono->findAll(null, null, "Abono.tipo, Abono.cantidad_desde"));
    }

    /**
     * Permite al cliente visualizar/imprimir su factura para ir a un pago facil.
     *
     */
    function imprimir($id=null) {
        if (!empty($id) && is_numeric($id)) {
            $documento = $this->Documento->find(array("Documento.id" => $id, array("or" => array(array("Documento.documento_tipo_id" => 1), array("Documento.documento_tipo_id" => 2)))));
            $opciones['numero_pago_facil'] = "0771";
            $opciones['monto'] = substr($documento['Documento']['importe_bruto'], 0, strlen($documento['Documento']['importe_bruto']) - 2); //dos decimales
            $opciones['fecha_primer_vencimiento'] = $documento['Documento']['fecha_emision'];
            $opciones['recargo'] = "2";
            $opciones['dias_segundo_vencimiento'] = 10;
            $opciones['identificador'] = $documento['Documento']['id'];

            $codigoPagoFacil = $this->__generarCodigoBarraPagoFacil($opciones);
            $documento['Documento']['codigoBarras'] = $this->__generarImagenCodigoBarraPagoFacil($codigoPagoFacil);
//            d($documento);
            $filename = IMAGES . DS . 'tmp' . DS . 'BC-' . $documento['Documento']['numero'] . '.png';
            if (file_exists($filename)) {
                $documento['Documento']['codigoBarras'] = 'tmp' . DS . 'BC-' . $documento['Documento']['numero'] . '.png';
            }
//            echo $filename;
            $this->set("documento", $documento);
            $this->set("opciones", $opciones);
            $this->layout = "imprimir";
        } else {
            $this->redirect('micta', null, true);
        }
    }

    /**
     * Permite a partir del archivo que retorna afip asociar el cae al documento.
     *
     */
    function importar_rece() {
        if (!empty($this->data['Movimiento']['archivo']['tmp_name'])) {
            if (is_uploaded_file($this->data['Movimiento']['archivo']['tmp_name'])) {
                if ($this->data['Movimiento']['archivo']['size'] > 500000) {
                    $this->Session->setFlash('No fue posible subir el archivo. Verifique que su peso no supere los 500 Kb.', 'error');
                    $this->redirect('importar_rece', null, true);
                } else {
                    $tipoComprobante['01'] = "1";
                    $tipoComprobante['06'] = "2";
                    $tipoComprobante['08'] = "5";
                    $tipoComprobante['03'] = "4";
                    $tipoComprobante['02'] = "6";
                    $tipoComprobante['07'] = "7";

                    $archivo = file($this->data['Movimiento']['archivo']['tmp_name']);


                    /* $dato[] = substr($archivo, 0, 1);
                      $dato[] = substr($archivo, 1, 12);
                      $dato[] = substr($archivo, 12, 2);
                      $dato[] = substr($archivo, 14, 12);
                      $dato[] = substr($archivo, 26, 4);
                      $dato[] = substr($archivo, 30, 3);
                      $dato[] = substr($archivo, 33, 15);
                      $dato[] = substr($archivo, 48, 4);
                      $dato[] = substr($archivo, 52, 4);
                      $dato[] = substr($archivo, 56, 6);
                     */
                    $estado = substr($archivo[0], 62, 1);
                    /*
                      $dato[] = substr($archivo, 63, 2);
                      $dato[] = substr($archivo, 65, 1);
                     */
                    if ($estado != "A") {
                        $this->Session->setFlash('El comprobante no ha sido aprobado por AFIP.', 'error');
                        $this->redirect('importar_rece', null, true);
                    }


                    $dato['fecha_emision'] = substr($archivo[1], 1, 4) . "-" . substr($archivo[1], 5, 2) . "-" . substr($archivo[1], 7, 2);
                    $dato['documento_tipo_id'] = $tipoComprobante[substr($archivo[1], 9, 2)];
                    if ($dato['documento_tipo_id'] == 1) {//tipo A
                        $letra = "A";
                    } elseif ($dato['documento_tipo_id'] == 2) {//tipo B
                        $letra = "B";
                    }
                    $dato['numero'] = $letra . "-" . substr($archivo[1], 11, 4) . "-" . substr($archivo[1], 15, 8);
                    $cae = substr($archivo[1], 135, 14);
                    $documento = $this->Documento->find($dato);

                    if (!empty($documento)) {
                        if ($this->Documento->save(array("id" => $documento['Documento']['id'], "cae" => $cae))) {
                            $this->Session->setFlash('El cae se asigno correctamente.', 'ok');
                        } else {
                            $this->Session->setFlash('No fue posible asignar el cae.', 'error');
                        }
                    } else {
                        $this->Session->setFlash('No fue posible encontrar un documento para este cae.', 'error');
                    }

                    /*
                      $dato[] = substr($archivo, 0, 1);
                      $dato[] = substr($archivo, 1, 12);
                      $dato[] = substr($archivo, 12, 2);
                      $dato[] = substr($archivo, 14, 12);
                      $dato[] = substr($archivo, 26, 4);
                      $dato[] = substr($archivo, 30, 3);
                      $dato[] = substr($archivo, 33, 15);
                      $dato[] = substr($archivo, 48, 4);
                      $dato[] = substr($archivo, 52, 4);
                      $dato[] = substr($archivo, 56, 6);
                      $dato[] = substr($archivo, 62, 1);
                      $dato[] = substr($archivo, 63, 2);
                      $dato[] = substr($archivo, 65, 1);
                     */
                    $this->redirect('importar_rece', null, true);
                }
            } else {
                $this->Session->setFlash('No fue posible subir el archivo.', 'error');
                $this->redirect('importar_rece', null, true);
            }
        }
    }

    /**
     * Permite al cliente ver su cta cte.
     *
     */
    function micta() {
        $usuario = $this->Session->read('Usuario');
        $this->data['Filtro']['Documento-usuario_id'] = $usuario['Usuario']['id'];
        $condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
        $this->paginate['conditions'] = $condicion;
        $this->paginate['order'] = "fecha_emision desc";
        $this->paginate['limit'] = 1000000;
        $this->set('registros', $this->paginate());
    }

    /**
     * Facturar.
     *
     */
    function facturar() {
        $registros = array();
        $this->set('registros', $registros);
        $meses[1] = "Enero";
        $meses[2] = "Febrero";
        $meses[3] = "Marzo";
        $meses[4] = "Abril";
        $meses[5] = "Mayo";
        $meses[6] = "Junio";
        $meses[7] = "Julio";
        $meses[8] = "Agosto";
        $meses[9] = "Septiembre";
        $meses[10] = "Octubre";
        $meses[11] = "Noviembre";
        $meses[12] = "Diciembre";

        if (!empty($this->data)) {
            $this->Usuario->recursive = 2;
            $this->Usuario->expects(array("Usuario", "AbonosUsuario", "Abono"));
            //$usuarios = $this->Usuario->findAll(array("Grupo.nombre"=>"Usuarios", "Usuario.estado"=>dominio("estados_seguridad", "Activo")));
            $usuarios = $this->Usuario->findAll(array("Usuario.grupo_id" => "4", "Usuario.estado" => dominio("estados_seguridad", "Activo")));
            if (!empty($usuarios)) {

                if (isset($this->data['Factura']['numeroA']) && is_numeric($this->data['Factura']['numeroA']))
                    $numeroA = $this->data['Factura']['numeroA'];

                if (isset($this->data['Factura']['numeroB']) && is_numeric($this->data['Factura']['numeroB']))
                    $numeroB = $this->data['Factura']['numeroB'];

                if (!isset($numeroA) || !isset($numeroB)) {
                    $this->Session->setFlash('Debe cargar por el ultimo numero de factura A y el numero de factura B.', 'error');
                    unset($this->data);
                    $this->redirect('facturar', null, true);
                }

                //d($this->data);
                $mes = $this->data['Filtro']['Movimiento-periodo'];
                $ano = $this->data['Filtro']['Movimiento-ano'];
                if ($mes == 1) {
                    $mes_ant = 12;
                    $ano_ant = $ano - 1;
                } else {
                    $mes_ant = $mes - 1;
                    $ano_ant = $ano;
                }
                $desde = date("Y-m-d", mktime(0, 0, 0, $mes_ant, 1, $ano_ant));
                $hasta = date("Y-m-d", mktime(0, 0, 0, $mes, 1, $ano));

                foreach ($usuarios as $k => $usuario) {
                    foreach ($usuario['AbonosUsuario'] as $k1 => $v1) {
                        $precio = $v1['Abono']['precio'];
                        $descuento = $v1['descuento'];
                        $excedente = $v1['Abono']['precio_excedente'];
                        $proporciona = $v1['Abono']['proporciona'];
                        $cantidad = $v1['Abono']['cantidad_hasta'];

                        if ($v1['Abono']['tipo'] == 25) {//sims
                            //SIMS
                            $simsPeriodoAFacturar = $this->Sim->traerCantidad($usuario['Usuario']['id']);
                            $simsPeriodoAnterior = 0;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAnterior'] = $simsPeriodoAnterior;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAFacturar'] = $simsPeriodoAFacturar;

                            if ($simsPeriodoAnterior > $cantidad) { //hay excedente
                                $tmp = ($simsPeriodoAnterior - $cantidad) * $excedente;
                                $importe_excedentes = $tmp - ($tmp * $descuento / 100);
                            }
                            else
                                $importe_excedentes = 0;

                            $usuarios[$k]['AbonosUsuario'][$k1]['ImporteExcedente'] = $importe_excedentes;
                            if ($proporciona == "0" || empty($proporciona)) {
                                $importe = $precio - ($precio * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            } elseif ($v1['Abono']['proporciona'] == "1") {
                                $importe = $precio * $simsPeriodoAFacturar;
                                $importe = $importe - ($importe * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            }
                        } elseif ($v1['Abono']['tipo'] == 26) {//clientes
                            //CLIENTES
                            $clientesPeriodoAFacturar = $this->Cliente->traerCantidad($usuario['Usuario']['id']);
                            $clientesPeriodoAnterior = 0;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAnterior'] = $clientesPeriodoAnterior;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAFacturar'] = $clientesPeriodoAFacturar;

                            if ($clientesPeriodoAnterior > $cantidad) { //hay excedente
                                $tmp = ($clientesPeriodoAnterior - $cantidad) * $excedente;
                                $importe_excedentes = $tmp - ($tmp * $descuento / 100);
                            }
                            else
                                $importe_excedentes = 0;

                            $usuarios[$k]['AbonosUsuario'][$k1]['ImporteExcedente'] = $importe_excedentes;
                            if ($proporciona == "0" || empty($proporciona)) {
                                $importe = $precio - ($precio * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            } elseif ($v1['Abono']['proporciona'] == "1") {
                                $importe = $precio * $clientesPeriodoAFacturar;
                                $importe = $importe - ($importe * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            }
                        } elseif ($v1['Abono']['tipo'] == 27) {//alertas (sms)
                            //ALERTAS
                            $alertasPeriodoAnterior = $this->Alerta->traerCantidad($usuario['Usuario']['id'], $desde, $hasta);
                            $alertasPeriodoAFacturar = $cantidad;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAnterior'] = $alertasPeriodoAnterior;
                            $usuarios[$k]['AbonosUsuario'][$k1]['PeriodoAFacturar'] = $alertasPeriodoAFacturar;

                            if ($alertasPeriodoAnterior > $cantidad) { //hay excedente
                                $tmp = ($alertasPeriodoAnterior - $cantidad) * $excedente;
                                $importe_excedentes = $tmp - ($tmp * $descuento / 100);
                            }
                            else
                                $importe_excedentes = 0;

                            $usuarios[$k]['AbonosUsuario'][$k1]['ImporteExcedente'] = $importe_excedentes;
                            if ($proporciona == "0" || empty($proporciona)) {
                                $importe = $precio - ($precio * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            } elseif ($v1['Abono']['proporciona'] == "1") {
                                $importe = $precio * $alertasPeriodoAFacturar;
                                $importe = $importe - ($importe * $descuento / 100);
                                $usuarios[$k]['AbonosUsuario'][$k1]['ImporteTotal'] = $importe_excedentes + $importe;
                            }
                        }
                    }
                    $facturado = $this->Documento->find(array("periodo_mes" => $mes, "periodo_ano" => $ano, "Documento.usuario_id" => $usuario['Usuario']['id']));
                    if (!empty($facturado))
                        $usuarios[$k]['Usuario']['facturado'] = 1;
                }
            }

            if (isset($this->data['Filtro']['accion']) && $this->data['Filtro']['accion'] == "facturar") {
                foreach ($usuarios as $k => $usuario) {
                    //si destildo
                    if (!isset($this->data['Factura']['usuario'][$usuario['Usuario']['id']])) {
                        unset($usuarios[$k]);
                        continue;
                    }

                    if ($usuario['Usuario']['tipo_iva'] == 29) { //responsable inscripto
                        $tipo = "1"; //Factura A
                        $numeroA++;
                        $numero = "A-0004-" . str_pad($numeroA, 8, "0", STR_PAD_LEFT);
                    } else {
                        $tipo = "2"; //Factura B
                        $numeroB++;
                        $numero = "B-0004-" . str_pad($numeroB, 8, "0", STR_PAD_LEFT);
                    }


                    $save = $save_detalle = false;
                    $total = 0;
                    foreach ($usuario['AbonosUsuario'] as $k1 => $v1) {
                        if ($v1['ImporteExcedente'] > 0) { //si hay excedentes los pongo como otro concepto
                            $total += $v1['ImporteExcedente'];
                            $save_detalle['DocumentosDetalle'][] = array('id' => false,
                                'descripcion' => "Excedentes " . $v1['Abono']['nombre'],
                                'importe_neto' => $v1['ImporteExcedente'],
                                'importe_bruto' => $v1['ImporteExcedente'] + ($v1['ImporteTotal'] * $this->iva / 100));
                        }

                        $total += $v1['ImporteTotal'];
                        $save_detalle['DocumentosDetalle'][] = array('id' => false,
                            'descripcion' => $v1['Abono']['nombre'],
                            'importe_neto' => $v1['ImporteTotal'],
                            'importe_bruto' => $v1['ImporteTotal'] + ($v1['ImporteTotal'] * $this->iva / 100));
                    }
                    if ($total > 0) {
                        $save['Documento'] = array('documento_tipo_id' => $tipo,
                            'usuario_id' => $usuario['Usuario']['id'],
                            'estado' => "N",
                            'periodo_mes' => $mes,
                            'periodo_ano' => $ano,
                            'numero' => $numero,
                            'fecha_emision' => date("Y-m-d"),
                            'importe_neto' => $total,
                            'importe_bruto' => $total + ($total * $this->iva / 100),
                            'saldo' => $total + ($total * $this->iva / 100));

                        $this->Documento->create();
//                        die(pr(am($save, $save_detalle)));
                        $this->Documento->save(am($save, $save_detalle));
                        $this->send_email_movimiento($usuario, $save['Documento'], $meses);
                    }
                }
                $this->Session->setFlash('La facturacion se realizo correctamente.', 'ok');
                $this->redirect('ctacte', null, true);
            }

            $this->set('facturar', true);
            $this->set('registros', $usuarios);
        }
        $this->set('meses', $meses);
    }
    
    /**
     * Funcion para enviar un email al usuario al generar una factura
     */
    private function send_email_movimiento($usuario, $comprobante, $meses){
        $body = '';
        $body.= "Estimado/a {$usuario['Usuario']['razon_social']}<br><br>";
        $body.= "Le informamos que se gener&oacute; la factura {$comprobante['numero']}, correspondiente al per&iacute;odo {$meses[$comprobante['periodo_mes']]}-{$comprobante['periodo_ano']} ";
        $body.= "por un total de $ {$comprobante['importe_bruto']}.<br><br>";
        $body.= "Atte. DatAgro";
        //echo $body;die;
		$this->Mailer->From = "alertas@datagro.com.ar";
		$this->Mailer->FromName = "DataAgro";
		$this->Mailer->AddAddress($usuario['Usuario']['email']);
		$this->Mailer->Subject = "Se genero una factura";
		$this->Mailer->Body = $body;
		$this->Mailer->IsHTML (true);
		 
		$this->Mailer->IsSMTP();
		$this->Mailer->Host     = "smtp.pragmatia.com.ar";
		$this->Mailer->Mailer   = "smtp";

		$this->Mailer->SMTPAuth = true;
		$this->Mailer->Username = 'postmaster@datagro.com.ar';
		$this->Mailer->Password = 'data8877';

		if( !$this->Mailer->Send() ) {
			echo 'Error: ' . $this->Mailer->ErrorInfo;
		}
    }

    /**
     * Cuenta Corriente.
     *
     */
    function ctacte() {
        if (!empty($this->data)) {
            $condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
            $this->paginate['conditions'] = $condicion;
        }
        $this->paginate['order'] = "fecha_emision desc";
        $this->paginate['limit'] = 1000000;
        $this->set('registros', $this->paginate());
        $usuarios = $this->Usuario->generateList(array("Usuario.grupo_id" => "4", "Usuario.estado" => dominio("estados_seguridad", "Activo")), null, null, null, "{n}.Usuario.nombre");
        $this->set('usuarios', $usuarios);
    }

    /**
     * Detalles de la Cuenta Corriente.
     *
     */
    function detalles($id = false) {
        $detalles = array();
        if ($id && is_numeric($id)) {
            $this->Documento->recursive = 1;
            $detalles = $this->Documento->findById($id);
        }
        $this->set('detalles', $detalles);
    }

    private function cobroDigital($url, $data = array(), &$respuesta = '') {
        $respuesta = '';
        $curl_error = '';
        set_time_limit(0);

        $ch = curl_init(); //open connection
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        if (!empty($data)) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); //en segundos
        $respuesta = curl_exec($ch);
        if (curl_errno($ch))
            $curl_error = ' #' . curl_errno($ch) . ' ' . curl_error($ch);
        curl_close($ch); //close connection

        return $curl_error;
    }

    private function saveImageBarCode($html_respuesta, $document_id) {
        $pattern = "/\<img src='([^']+)' alt='Si ve este texto es porque fallo la impresion del codigo de barras' \/\>/";
        preg_match($pattern, $html_respuesta, $result);
        if (!empty($result)) {
            $image_name = $result[1];
            $this->cobroDigital($image_name, 0, $image);
            if (!empty($image)) {
                $filename = IMAGES . DS . 'tmp' . DS . 'BC-' . $document_id . '.png';
                $imagen = imagecreatetruecolor(374, 85);
                imagecopyresampled($imagen, imagecreatefromstring($image), 0, 0, 0, 52, 374, 85, 374, 85);
                imagepng($imagen, $filename);
//                file_put_contents($filename, $imagen);
                return TRUE;
            }
        }
        return FALSE;
    }

    /**
     * Facturacion Manual.
     *
     */
    function manual() {
        if (!empty($this->data)) {
            if (isset($this->data['Factura']['accion']) && $this->data['Factura']['accion'] == "guardar" && isset($this->data['Factura']['documento'])) {
                $save = unserialize($this->data['Factura']['documento']);
                $email = 'dribba@pragmatia.com.ar';
                if (!empty($save['Usuario']['email'])) {
                    $email = $save['Usuario']['email'];
                }
                $post_array = array(
                    'bopa_idcomercio' => 'GB389962',
                    'bopa_genscript' => 'botondepago',
                    'bopa_importe' => $save['Documento']['importe_bruto'],
                    'txi_identificador' => $save['Documento']['numero'],
                    'txi_articulo' => "Orden de Pago #{$save['Documento']['numero']}",
                    'bopa_fvto' => "10c",
                    'txi_mail' => $email,
                );
                $url = 'https://www.cobrodigital.com/wse/botonpago_checkin.php';
                $rta = '';
                $error = $this->cobroDigital($url, $post_array, $rta);
//                var_dump($error);
//                pr($rta);
                $this->saveImageBarCode($rta, $save['Documento']['numero']);
                if (strlen($rta) > 0) {
                    $this->saveImageBarCode($rta, $save['Documento']['numero']);
                }
                unset($save['Usuario']);
                $this->Documento->create();
//                die(pr($save));
                if ($this->Documento->save($save))
                    $this->Session->setFlash('El comprobante se guardo correctamente.', 'ok');
                else
                    $this->Session->setFlash('No fue posible guardar el comprobante.', 'error');
                unset($this->data);
                $this->redirect('manual', null, true);
            }
            elseif (isset($this->data['Factura']['accion']) && $this->data['Factura']['accion'] == "previsualizar") {
                if (isset($this->data['Factura']['numeroA']) && is_numeric($this->data['Factura']['numeroA']))
                    $numeroA = "A-0004-" . str_pad($this->data['Factura']['numeroA'], 8, "0", STR_PAD_LEFT);

                if (isset($this->data['Factura']['numeroB']) && is_numeric($this->data['Factura']['numeroB'])) {
                    $numeroB = "B-0004-" . str_pad($this->data['Factura']['numeroB'], 8, "0", STR_PAD_LEFT);
                }

                if (isset($this->data['Factura']['numeroRecibo']) && is_numeric($this->data['Factura']['numeroRecibo'])) {
                    $numeroRecibo = $this->data['Factura']['numeroRecibo'];
                }

                if (isset($this->data['Factura']['documentosTipo']) && is_numeric($this->data['Factura']['documentosTipo'])) {
                    $tipo = $this->data['Factura']['documentosTipo'];
                } else {
                    $this->Session->setFlash('Debe seleccionar un Tipo de Documento.', 'error');
                    $this->redirect('manual', null, true);
                }

                if (!isset($numeroA) && ($tipo == 1 || $tipo == 4 || $tipo == 5)) {
                    $this->Session->setFlash('Debe cargar el ultimo numero de factura A.', 'error');
                    unset($this->data);
                    $this->redirect('manual', null, true);
                } elseif (!isset($numeroB) && ($tipo == 2 || $tipo == 5 || $tipo == 7)) {
                    $this->Session->setFlash('Debe cargar el ultimo numero de factura B.', 'error');
                    unset($this->data);
                    $this->redirect('manual', null, true);
                } elseif (!isset($numeroRecibo) && $tipo == 3) {
                    $this->Session->setFlash('Debe cargar el ultimo numero de Recibo.', 'error');
                    unset($this->data);
                    $this->redirect('manual', null, true);
                }

                $periodo_ano = 0;
                $periodo_mes = 0;
                if (isset($this->data['Factura']['periodo_mes']) && isset($this->data['Factura']['periodo_ano']) && is_numeric($this->data['Factura']['periodo_mes']) && is_numeric($this->data['Factura']['periodo_ano'])) {
                    $periodo_mes = $this->data['Factura']['periodo_mes'];
                    $periodo_ano = $this->data['Factura']['periodo_ano'];
                }

                if ($tipo == 1 || $tipo == 4 || $tipo == 6)
                    $numero = $numeroA;
                elseif ($tipo == 2 || $tipo == 5 || $tipo == 7)
                    $numero = $numeroB;
                elseif ($tipo == 3)
                    $numero = $numeroRecibo;


                $save_detalle['DocumentosDetalle'] = array();
                $total = 0;
                if (isset($this->data['Factura']['concepto1']) && !empty($this->data['Factura']['concepto1']) && isset($this->data['Factura']['precio1']) && !empty($this->data['Factura']['precio1']) && is_numeric($this->data['Factura']['precio1'])) {
                    $save_detalle['DocumentosDetalle'][] = array('id' => false,
                        'descripcion' => $this->data['Factura']['concepto1'],
                        'importe_neto' => $this->data['Factura']['precio1'],
                        'importe_bruto' => $this->data['Factura']['precio1'] + ($this->data['Factura']['precio1'] * $this->iva / 100));
                    $total+=$this->data['Factura']['precio1'];
                }
                if (isset($this->data['Factura']['concepto2']) && !empty($this->data['Factura']['concepto2']) && isset($this->data['Factura']['precio2']) && !empty($this->data['Factura']['precio2']) && is_numeric($this->data['Factura']['precio2'])) {
                    $save_detalle['DocumentosDetalle'][] = array('id' => false,
                        'descripcion' => $this->data['Factura']['concepto2'],
                        'importe_neto' => $this->data['Factura']['precio2'],
                        'importe_bruto' => $this->data['Factura']['precio2'] + ($this->data['Factura']['precio2'] * $this->iva / 100));
                    $total+=$this->data['Factura']['precio2'];
                }
                if (isset($this->data['Factura']['concepto3']) && !empty($this->data['Factura']['concepto3']) && isset($this->data['Factura']['precio3']) && !empty($this->data['Factura']['precio3']) && is_numeric($this->data['Factura']['precio3'])) {
                    $save_detalle['DocumentosDetalle'][] = array('id' => false,
                        'descripcion' => $this->data['Factura']['concepto3'],
                        'importe_neto' => $this->data['Factura']['precio3'],
                        'importe_bruto' => $this->data['Factura']['precio3'] + ($this->data['Factura']['precio3'] * $this->iva / 100));
                    $total+=$this->data['Factura']['precio3'];
                }


                if (!empty($this->data['Factura']['usuario']) && is_numeric($this->data['Factura']['usuario']) && isset($this->data['Factura']['fecha']) && !empty($this->data['Factura']['fecha'])) {
                    $this->Usuario->expects();
                    $usuario = $this->Usuario->findById($this->data['Factura']['usuario']);

                    if (empty($usuario)) {
                        $this->Session->setFlash('Debe seleccionar un usuario con un Tipo de Iva asignado.', 'error');
                        unset($this->data);
                        $this->redirect('manual', null, true);
                    }


                    if ($total == 0) {
                        $this->Session->setFlash('Debe escribir por lo menos un concepto con su precio.', 'error');
                        unset($this->data);
                        $this->redirect('manual', null, true);
                    }


                    $save['Documento'] = array('documento_tipo_id' => $tipo,
                        'usuario_id' => $this->data['Factura']['usuario'],
                        'estado' => "N",
                        'numero' => $numero,
                        'periodo_mes' => $periodo_mes,
                        'periodo_ano' => $periodo_ano,
                        'fecha_emision' => $this->Formato->formatearFecha($this->data['Factura']['fecha']),
                        'importe_neto' => $total,
                        'importe_bruto' => $total + ($total * $this->iva / 100),
                        'saldo' => $total + ($total * $this->iva / 100));
                    $this->set('registro', am($save, $save_detalle, $usuario));
                    $this->render('manual_previsualizar');
                } else {
                    $this->Session->setFlash('Debe seleccionar un usuario.', 'error');
                    $usuarios = $this->Usuario->generateList(array("Usuario.grupo_id" => "4", "Usuario.estado" => dominio("estados_seguridad", "Activo")), null, null, null, "{n}.Usuario.nombre");
                    $this->set('usuarios', $usuarios);
                    $this->set('documentos_tipo', $this->Documento->DocumentosTipo->generateList(null, null, null, null, "{n}.DocumentosTipo.nombre"));
                }
            }
        } else {
            $meses[1] = "Enero";
            $meses[2] = "Febrero";
            $meses[3] = "Marzo";
            $meses[4] = "Abril";
            $meses[5] = "Mayo";
            $meses[6] = "Junio";
            $meses[7] = "Julio";
            $meses[8] = "Agosto";
            $meses[9] = "Septiembre";
            $meses[10] = "Octubre";
            $meses[11] = "Noviembre";
            $meses[12] = "Diciembre";
            $this->set('meses', $meses);

            $usuarios = $this->Usuario->generateList(array("Usuario.grupo_id" => "4", "Usuario.estado" => dominio("estados_seguridad", "Activo")), null, null, null, "{n}.Usuario.nombre");
            $this->set('usuarios', $usuarios);
            $this->set('documentos_tipo', $this->Documento->DocumentosTipo->generateList(null, null, null, null, "{n}.DocumentosTipo.nombre"));
        }
    }

    function generarArchivoRece($id) {
        $tipoComprobante[1] = "01";
        $tipoComprobante[2] = "06";
        $tipoComprobante[5] = "08";
        $tipoComprobante[4] = "03";
        $tipoComprobante[6] = "02";
        $tipoComprobante[7] = "07";
        //$tipoComprobante[3] = "07";
        //$documentos = $this->Documento->findAll("documento_tipo_id in (1,2)");
        $documentos = $this->Documento->findAll("Documento.id = {$id}");
        //$documentos = $this->Documento->findById($id);
        //d($documentos);
        foreach ($documentos as $k => $v) {
            $registro = array();
            $numero = explode("-", $v['Documento']['numero']);
            //debug($numero);

            $registro[1] = "1";
            $registro[2] = str_replace("-", "", $v['Documento']['fecha_emision']);
            $registro[3] = $tipoComprobante[$v['Documento']['documento_tipo_id']];
            $registro[4] = " "; //no va
            $registro[5] = "0004";
            $registro[6] = str_pad($numero[2], 8, "0", STR_PAD_LEFT);
            $registro[7] = str_pad($numero[2], 8, "0", STR_PAD_LEFT);
            $registro[8] = "   "; //no va numerico
            $registro[9] = "80";
            $registro[10] = str_replace("-", "", $v['Usuario']['cuit']);
            $registro[11] = substr(str_pad($v['Usuario']['nombre'] . "-" . $v['Usuario']['razon_social'], 30, " ", STR_PAD_RIGHT), 0, 30);
            $registro[12] = str_pad(str_replace(".", "", number_format($v['Documento']['importe_bruto'], 2)), 15, "0", STR_PAD_LEFT);
            $registro[13] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[14] = str_pad(str_replace(".", "", number_format($v['Documento']['importe_neto'], 2)), 15, "0", STR_PAD_LEFT);
            $registro[15] = str_pad(str_replace(".", "", number_format($v['Documento']['importe_bruto'] - $v['Documento']['importe_neto'], 2)), 15, "0", STR_PAD_LEFT);
            $registro[16] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[17] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[18] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[19] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[20] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[21] = str_pad("0", 15, "0", STR_PAD_LEFT);
            $registro[22] = str_pad($v['Documento']['periodo_ano'], 4, "0", STR_PAD_LEFT) . str_pad($v['Documento']['periodo_mes'], 2, "0", STR_PAD_LEFT) . "01";
            $registro[23] = str_pad($v['Documento']['periodo_ano'], 4, "0", STR_PAD_LEFT) . str_pad($v['Documento']['periodo_mes'], 2, "0", STR_PAD_LEFT) . idate('d', mktime(0, 0, 0, ($v['Documento']['periodo_mes'] + 1), 0, $v['Documento']['periodo_ano']));
            $registro[24] = str_pad($v['Documento']['periodo_ano'], 4, "0", STR_PAD_LEFT) . str_pad($v['Documento']['periodo_mes'], 2, "0", STR_PAD_LEFT) . idate('d', mktime(0, 0, 0, ($v['Documento']['periodo_mes'] + 1), 0, $v['Documento']['periodo_ano']));
            $registro[25] = "000000";
            $registro[26] = " "; //no va numerico
            $registro[27] = " "; //no va
            $registro[28] = str_pad("0", 14, "0", STR_PAD_LEFT);
            $registro[29] = str_pad("0", 8, "0", STR_PAD_LEFT);
            $registro[30] = str_pad("0", 8, "0", STR_PAD_LEFT);

            $archivo = "CABECERA_" . date("Y") . date("m") . ".txt";
            $ruta_archivo = APP . DS . "webroot" . DS . "files" . DS . $archivo;
            file_put_contents($ruta_archivo, join("", $registro));
            $this->set('ruta_archivo', $ruta_archivo);
            $this->Session->write('nombreArchivo', $ruta_archivo);
            $this->layout = "texto";
            //readfile($ruta_archivo);
            //$this->set("nombre", $nombre);
        }
    }

    /**
     * Cobranzas.
     *
     */
    function cobranzas() {
        /*
          if (file_exists("{$g_ruta_filesystem}/archivos/{$archivo}"))
          {
          $contenido=file("{$g_ruta_filesystem}/archivos/{$archivo}");

          // fecha de emision

          $cmp_fecha_emision=substr(array_shift($contenido),1,8);
          $cmp_fecha_emision=substr($cmp_fecha_emision,0,4)."-".substr($cmp_fecha_emision,4,2)."-".substr($cmp_fecha_emision,6,2);

          // limpio el array

          array_shift($contenido);
          array_pop($contenido);
          array_pop($contenido);

          // obtengo las formas de pago

          foreach ($contenido as $k=>$v)
          {
          if (empty($tmp))
          {
          $tmp=array();
          }

          $tmp[]=$v;

          if (substr($v,0,5)=="7PESE")
          {
          $tmp=explode(" ",implode($tmp));

          $arr=false;

          foreach ($tmp as $tmp_valor)
          {
          if (trim($tmp_valor)=="" || !$tmp_valor)
          {
          continue;
          }
          $arr[]=trim($tmp_valor);
          }

          if ($arr)
          {
          // no se estan tomando cheques mmm

          $datos[0]=(int)(substr($arr[0], -7,7));
          $datos[1]=(int)(substr($arr[0],-14,6));
          $datos[2]="EPF";
          $datos[3]=((int)substr($arr[1],3,8).".".substr($arr[1],11,2));
          $comprobantes[]=$datos;
          }
          $tmp=false;
          }
          }
          }
         */
    }

    function __generarCodigoBarraPagoFacil($parametro) {
        //Calculo los dias para el primer vencimiento
        $v_fecha_primer_vencimiento = explode("-", $parametro['fecha_primer_vencimiento']);
        $ano_primer_vencimiento = substr($v_fecha_primer_vencimiento[0], 2, 2);


        $fecha_inicio = mktime(0, 0, 0, 1, 1, $ano_primer_vencimiento);
        $fecha_primer_vencimiento = mktime(0, 0, 0, $v_fecha_primer_vencimiento[1], $v_fecha_primer_vencimiento[2], $v_fecha_primer_vencimiento[0]);
        $diff = $this->__diferenciaEntreFechas($fecha_primer_vencimiento, $fecha_inicio);
        $dias_de_diferencia = false;
        $dias_de_diferencia_primer_vencimiento = str_pad($diff[0] + 1, 3, "0", STR_PAD_LEFT);

        $monto = str_replace(",", "", number_format($parametro['monto'], 2));
        $monto = str_replace(".", "", $monto);
        $monto = str_pad($monto, 8, "0", STR_PAD_LEFT);

        $recargo = number_format($parametro['monto'] * $parametro['recargo'] / 100, 2);
        $recargo = str_replace(".", "", $recargo);
        $recargo = str_pad($recargo, 6, "0", STR_PAD_LEFT);

        $moneda = "0"; //pesos
        $codigo[] = $parametro['numero_pago_facil'];
        $codigo[] = $monto;
        $codigo[] = $ano_primer_vencimiento . $dias_de_diferencia_primer_vencimiento;
        $codigo[] = str_pad($parametro['identificador'], 14, "0", STR_PAD_LEFT);
        $codigo[] = "0";
        $codigo[] = $recargo;
        $codigo[] = str_pad($parametro['dias_segundo_vencimiento'], 2, "0", STR_PAD_LEFT);
        $sCodigo = implode("", $codigo);

        //calculo el primer digito verificador
        //$sCodigo = "0123000051000412500000000001234000015010";
        $sCodigo .= $this->__generarDigitoVerificadorPagoFacil($sCodigo);
        $sCodigo .= $this->__generarDigitoVerificadorPagoFacil($sCodigo);

        return $sCodigo;
    }

    //calculo del digito verificador
    function __generarDigitoVerificadorPagoFacil($sCodigo) {

        $digito_verificador = 0;
        $mtemp = "135793579357935793579357935793579357935793579";
        for ($i = 0; $i <= strlen($sCodigo); $i++) {
            $digito_verificador += substr($mtemp, $i, 1) * substr($sCodigo, $i, 1);
        }
        return (($digito_verificador / 2) % 10); //saco el resto
    }

    function __generarImagenCodigoBarraPagoFacil($itemId) {
        if (((strlen($itemId)) % 2) == 0) {
            $new_string = "";
            $lbc = 0;
            $xi = 0;
            $k = 0;
            $bc_string = $itemId;
            $widthSlimBar = 1;
            $widthFatBar = 2;
            $BarCodeHeight = 20;
            $bc = array();

            $bc[0] = "00110";         //0 digit
            $bc[1] = "10001";         //1 digit
            $bc[2] = "01001";         //2 digit
            $bc[3] = "11000";         //3 digit
            $bc[4] = "00101";         //4 digit
            $bc[5] = "10100";         //5 digit
            $bc[6] = "01100";         //6 digit
            $bc[7] = "00011";         //7 digit
            $bc[8] = "10010";         //8 digit
            $bc[9] = "01010";         //9 digit
            $bc[10] = "0000";          //pre-amble
            $bc[11] = "100";           //post-amble

            $bc_string = strtoupper($bc_string);

            $lbc = strlen($bc_string) - 1;

            for ($xi = 0; $xi <= $lbc; $xi++) {
                $k = (int) substr($bc_string, $xi, 1);
                $new_string = $new_string . $bc[$k];
            }
            $bc_string = $new_string;

            $i = 0;
            $l = 0;
            $s = "";

            $l = strlen($bc_string);

            for ($i = 0; $i < $l; $i+=10) {
                $s = $s . $bc_string[$i] . $bc_string[$i + 5];
                $s = $s . $bc_string[$i + 1] . $bc_string[$i + 6];
                $s = $s . $bc_string[$i + 2] . $bc_string[$i + 7];
                $s = $s . $bc_string[$i + 3] . $bc_string[$i + 8];
                $s = $s . $bc_string[$i + 4] . $bc_string[$i + 9];
            }
            $bc_string = $s;

            $bc_string = $bc[10] . $bc_string . $bc[11];

            $lbc = strlen($bc_string) - 1;
            $imWidth = ($l * 1.9);

            $im = ImageCreate($imWidth, 60);
            $black = ImageColorAllocate($im, 0, 0, 0);
            $white = ImageColorAllocate($im, 255, 255, 255);
            ImageFill($im, 0, 0, $white);
            $Xposition = 2;

            for ($xi = 0; $xi <= $lbc; $xi++) {
                $imgBar = "";
                $imgWid = 0;

                $imgBar = ( $xi % 2 == 0 ) ? $black : $white;
                $imgWid = ( $bc_string[$xi] == "0" ) ? $widthSlimBar : $widthFatBar;

                $end_y = $BarCodeHeight;
                $end_y = $end_y + 5;
                for ($qw = 0; $qw < $imgWid; $qw++) {
                    ImageLine($im, ($Xposition), 1, ($Xposition), $end_y, $imgBar);
                    $Xposition++;
                }
            }
            $itemId = trim($itemId);

            ImageString($im, 1, 10, 30, "$itemId", $black);
            $nombre = 'tmp' . DS . time() . ".png";
            ImagePNG($im, WWW_ROOT . "img" . DS . $nombre);
            return $nombre;
        } else {
            return false;
        }
    }

    /**
     * La funcion calcula la diferencia entre dos fechas en fomato unix timestamp
     * Retorna un array con los dias, horas, minutos y segundos
     */
    function __diferenciaEntreFechas($time1, $time2) {
        if (!is_numeric($time1)) {
            if (strstr($time1, "/"))
                $time1 = formatear_fecha($time1);
            if (strstr($time1, "-")) {
                $temp = explode("-", $time1);
                $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
            }
        }
        if (!is_numeric($time2)) {
            if (strstr($time2, "/"))
                $time1 = formatear_fecha($time2);
            if (strstr($time2, "-")) {
                $temp = explode("-", $time2);
                $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
            }
        }

        //calculo en segundos
        $diff = abs($time1 - $time2);
        $daysDiff = floor($diff / 60 / 60 / 24);
        $diff -= $daysDiff * 60 * 60 * 24;
        $hrsDiff = floor($diff / 60 / 60);
        $diff -= $hrsDiff * 60 * 60;
        $minsDiff = floor($diff / 60);
        $diff -= $minsDiff * 60;
        $secsDiff = $diff;

        $diferencia = false;
        $diferencia[0] = $daysDiff;
        $diferencia[1] = $hrsDiff;
        $diferencia[2] = $minsDiff;
        $diferencia[3] = $secsDiff;

        return $diferencia;
    }

}

/*
  Title: Strlen() ant bytes string lenght.
  Just to remember that strlen() return the number of characters of a string. Often the strlen() function is used to compute the length in bytes of a string. This is correct until string is single byte encoded. If multi-byte char-set is used this constraint i no more verified. So when you require the number of bytes of a ASCII or UTF-8 encoded string, it is better to use following function:
 */

/**
 * Count the number of bytes of a given string.
 * Input string is expected to be ASCII or UTF-8 encoded.
 * Warning: the function doesn't return the number of chars
 * in the string, but the number of bytes.
 *
 * @param string $str The string to compute number of bytes
 *
 * @return The length in bytes of the given string.
 */
function strBytes($str) {
    // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
    // Number of characters in string
    $strlen_var = strlen($str);

    // string bytes counter
    $d = 0;

    /*
     * Iterate over every character in the string,
     * escaping with a slash or encoding to UTF-8 where necessary
     */
    for ($c = 0; $c < $strlen_var; ++$c) {

        $ord_var_c = ord($str{$d});

        switch (true) {
            case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
                // characters U-00000000 - U-0000007F (same as ASCII)
                $d++;
                break;

            case (($ord_var_c & 0xE0) == 0xC0):
                // characters U-00000080 - U-000007FF, mask 110XXXXX
                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                $d+=2;
                break;

            case (($ord_var_c & 0xF0) == 0xE0):
                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                $d+=3;
                break;

            case (($ord_var_c & 0xF8) == 0xF0):
                // characters U-00010000 - U-001FFFFF, mask 11110XXX
                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                $d+=4;
                break;

            case (($ord_var_c & 0xFC) == 0xF8):
                // characters U-00200000 - U-03FFFFFF, mask 111110XX
                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                $d+=5;
                break;

            case (($ord_var_c & 0xFE) == 0xFC):
                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                $d+=6;
                break;
            default:
                $d++;
        }
    }

    return $d;
}

?>